﻿using System.Runtime.InteropServices;
using System.Text;
using Microsoft.Win32;

namespace VMDS.Business.Processes
{
    public class SoftWare //#####################################################################
    {
        //###############_______ПОЛЯ, НЕДОСТУПНЫЕ ИЗВНЕ_______#################  
        //#####################################################################
        private const int ERROR_NO_MORE_ITEMS = 259; //#########----какая-то константа(копипаст)---########

        private const string INSTALLPROPERTY_INSTALLEDPRODUCTNAME = "InstalledProductName";

        public string Productname { get; set; }
        public string ProductVersion { get; set; }

        //#свойство "название продукта" #
        public bool Installed { get; set; }

        //# свойство "установлено" #
        public string InstallPath { get; set; }

        [DllImport("Msi.dll")] //
        private static extern uint MsiEnumProducts(uint iProductIndex, StringBuilder lpProductBuf);

        [DllImport("Msi.dll")]
        private static extern uint MsiGetProductInfo(string szProduct, string szProperty, StringBuilder lpValueBuf,
                                                     ref int pcchValueBuf);

//#свойство "местоположение"#

        public void Update() //############-------метод сбора информации-------##############
        {
            string s = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
            //##в этой ветке реестра лежат установленные проги##
            uint index = 0;
            bool res = false;
            string code = ""; //##############------сюда запомним GUID продукта-----#################
            string path = ""; //##############------сюда запомним путь продукта-----#################
            var productGUID = new StringBuilder(39);
            uint result;

            while ((result = (MsiEnumProducts(index++, productGUID))) != ERROR_NO_MORE_ITEMS)
            {
                int bufferSize = 1000;
                var valueBuffer = new StringBuilder(bufferSize);
                MsiGetProductInfo(productGUID.ToString(), INSTALLPROPERTY_INSTALLEDPRODUCTNAME, valueBuffer,
                                  ref bufferSize);
                code = productGUID.ToString();
                if (valueBuffer.ToString() == Productname)
                {
                    res = true;
                    break;
                }
                ;
            }
            Installed = res;
            RegistryKey key = Registry.LocalMachine.OpenSubKey(s); //открываем ключ реестра с установленным ПО
            foreach (string guid in key.GetSubKeyNames()) //ищем в этом списке нужный GUID
            {
                if (guid == code)
                {
                    path = key.OpenSubKey(guid).GetValue("InstallLocation").ToString();
                    ProductVersion = key.OpenSubKey(guid).GetValue("DisplayVersion").ToString();
                    break;
                }
            }
            InstallPath = path;
        }
    }
}